// https://www.luogu.com.cn/problem/P2678

#include <iostream>
#include <algorithm>
using namespace std;

int arr[50005];

bool check(int mid, int n, int target) {
    int removed = 0;
    int last = 0;  // 上一块保留的石头位置

    for (int i = 1; i <= n+1; i++) {
        if (arr[i] - last < mid) {
            // 需要移走当前石头
            removed++;
        } else {
            // 保留当前石头
            last = arr[i];
        }
    }

    return removed <= target;
}

int main() {
    int right, n, target;
    scanf("%d %d %d", &right, &n, &target);
    arr[0] = 0; arr[n+1] = right;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
    }

    int left = 1, ans = 0;
    while (left <= right) {
        int mid = (left + right) >> 1;
        if (check(mid, n, target)) {
            // 可行，尝试更大的值
            ans = mid;
            left = mid + 1;
        } else {
            // 不可行，尝试更小的值
            right = mid - 1;
        }
    }

    printf("%d\n", ans);
    return 0;
}